#include <iostream>
#include <vector>
// #include<string.h>
#include "thread.hpp"
using namespace ThreadModule;

int g_tickets = 10000;

class ThreadData
{
    public:
    ThreadData(int &tickets,const std::string &name)
        :_tickets(tickets)
        ,_name(name)
        ,_total(0)
    {}
    ~ThreadData()
    {}
    public:
     int &_tickets;
     std::string _name;
     int _total;
};
void route(ThreadData *td)
{
    while (true)
    {
        if(td->_tickets>0)
        {
            usleep(1000);
            printf("%s running get tickets: %d\n",td->_name.c_str(),td->_tickets);
            td->_tickets--;
            td->_total++;
        }
        else
        {
            break;
        }
    }
    
}
const int num = 4;
int main()
{
    std::vector<Thread<ThreadData*>> threads;
    std::vector<ThreadData*> datas;
        //创建一批线程
    for(int i = 0;i<num;i++)
    {
        std::string name  = "thread-" + std::to_string(i+1);
        ThreadData *td = new ThreadData(g_tickets,name);
        threads.emplace_back(route,td,name);
        datas.emplace_back(td);
    }
    //启动一批线程
    for(auto &thread:threads)
    {
        thread.Start();
    }
    //等待一批线程
    for (auto &thread:threads)
    {
        thread.Join();    
      //  std::cout<<"等待线程完成线程是："<<thread.name()<<std::endl;
    }
    //输出统计数据
    for(auto data :datas)
    {
        std::cout<<data->_name<<":"<<data->_total<<std::endl;
        delete data;
    }
    return 0;
}
// void print(int &cnt)
// {
//     std::cout<<"线程："<<cnt--<<std::endl;
// }
// const int num = 10;
// int main()
// {
// std::vector<Thread<int>> threads;
// //创建一批线程
// for(int i= 0;i<num;++i)
// {
//     std::string name = "thread-"+ std::to_string(i+1);
//     threads.emplace_back(print,10,name);
// }

//  //启动一批线程
//  for(auto &thread:threads)
//  {
//     thread.Start();
//  }
//  //f等待一批线程
//  for(auto &thraed:threads)
//  {
//     thraed.Join();
//     std::cout<<"等待线完成线程："<<thraed.name()<<std::endl;
//  }

//     return 0;
// }

// std::string ToHex(pthread_t tid)
// {
//      char id[64];
//      snprintf(id,sizeof(id),"0x%lx",tid);
//     return id;
// }
// __thread uint64_t  starttime =100;
// __thread int tid = 0;
// int g_val = 10;

// void *threadrun1(void* ages)
// {
//     starttime = time(nullptr);
//     std::string name = static_cast<const char *>(ages);
//     while (true)
//     {
//         sleep(1);
//         printf("%s,g_val:%lu,&g_val:%p\n",name.c_str(),starttime,&starttime);
//     }
//     return nullptr;

// }
// void *threadrun2(void * agrs)
// {
//     sleep(5);
//     starttime = time(nullptr);
//     std::string name = static_cast<const char *>(agrs);
//     while (true)
//     {
//         printf("%s,g_val:%lu,&g_val:%p\n",name.c_str(),starttime,&starttime);
//         sleep(1);
//     }
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid1;
//     pthread_t tid2;
//     pthread_create(&tid1,nullptr,threadrun1,(void*)"thread 1");
//     pthread_create(&tid2,nullptr,threadrun2,(void*)"thread 2");
//     pthread_join(tid1,nullptr);
//     pthread_join(tid2,nullptr);
//     std::cout<<"新线程 tid: "<<tid1<<",hex tid"<<ToHex(tid)<<std::endl;
//     std::cout<<"主线程 tid: "<<pthread_self()<<",hex tid:"<<
//     ToHex(pthread_self())<<std::endl;
//     int cnt = 5;
//     while (true)
//     {
//         if(!(cnt--))
//         {
//             break;
//         }
//         std::cout<<"主线程..."<<getpid()<<std::endl;
//         sleep(1);
//     }
//     std::cout<<"主线程块等待"<<std::endl;
//     int n = pthread_join(tid,nullptr);
//     std::cout<<"主线程等待返回值:"<<n<<strerror(n)<<std::endl;
//     return 0;
// }